#include <iostream>
#include <hiredis/hiredis.h>

using namespace std;

int main()
{
    // // connet to redis server
    // redisContext *redis_conn = redisConnect("192.168.1.122", 6379);
    // if (redis_conn == nullptr || redis_conn->err)
    // {
    //     redisFree(redis_conn);
    //     cout << "connect to redisServer faile" << endl;
    //     return 0;
    // }
    // cout << "connect to redisServer Success" << endl;

    // // set a key
    // redisReply *r = (redisReply *)redisCommand(redis_conn, "set name zhangsan");
    // if (r == nullptr || r->type == REDIS_REPLY_ERROR)
    // {
    //     cout << "execute command fail" << endl;
    //     redisFree(redis_conn);
    //     return 0;
    // }
    // cout << "set name success" << endl;

    // // get a key
    // r = (redisReply *)redisCommand(redis_conn, "get name");
    // if (r == nullptr)
    // {
    //     cout << "execute command fail" << endl;
    //     redisFree(redis_conn);
    //     return 0;
    // }
    // else if (r->type == REDIS_REPLY_NIL)
    // {
    //     cout << "no such key" << endl;
    //     freeReplyObject(r);
    //     redisFree(redis_conn);
    //     return 0;
    // }
    // else if (r->type != REDIS_REPLY_STRING)
    // {
    //     cout << "get value fail" << endl;
    //     freeReplyObject(r);
    //     redisFree(redis_conn);
    //     return 0;
    // }
    // cout << "get name success" << endl;

    // freeReplyObject(r);

    // 创建 Redis 上下文对象
    redisContext *conn = (redisContext *)malloc(sizeof(redisContext));

    // 设置 Redis 服务器的地址和端口号
    const char *hostname = "127.0.0.1";
    int port = 6379;

    // 连接到 Redis 服务器
    conn = redisConnect(hostname, port);

    if (conn == NULL || conn->err)
    {
        std::cout << "无法连接到 Redis 服务器！错误信息：" << conn->errstr << std::endl;
        return -1;
    }
    else
    {
        std::cout << "成功连接到 Redis 服务器！" << std::endl;

        // 向 Redis 发送命令并获取结果
        redisReply *reply = (redisReply *)redisCommand(conn, "SET mykey Hello");

        if (reply != nullptr && reply->type == REDIS_REPLY_STATUS)
        {
            std::cout << "设置键值对成功！" << std::endl;

            freeReplyObject(reply);

            // 再次从 Redis 获取数据
            reply = (redisReply *)redisCommand(conn, "GET mykey");

            if (reply != nullptr && reply->type == REDIS_REPLY_STRING)
            {
                std::cout << "获取到的值为：" << reply->str << std::endl;

                freeReplyObject(reply);
            }
            else
            {
                std::cout << "获取失败！" << std::endl;
            }
        }
        else
        {
            if (reply->type == REDIS_REPLY_ERROR)
            {
                std::cout << "设置键值对失败！错误信息：" << reply->str << std::endl;
            }
            else
            {
                std::cout << "设置键值对失败！" << std::endl;
            }
        }

        // 断开与 Redis 服务器的连接
        redisFree(conn);
    }

    return 0;
}